package continuity;

/**
 * Zetor csapat szekelton
 * 
 * A program célja hogy a modellről eldönthető legyen, hogy a feladat egy helyes
 * megoldását nyújtja.
 * 
 * @author Balogh Peter Tamas
 * @author Gál István László
 * @author Kárász Gábor
 * @author Simon Endre András
 * @author Szabó Alex
 */
public class Continuity {

    public static int tabs;

    // alkalmazás belépő pontja
    public static void main(String[] args) {
        // kiírjuk a 'menüt' és bekérjük a felhsználótól, hogy melyik tesztesetet akarja futtatni
        System.out.println("Zetor szekelton");
        System.out.println("Tesztesetek:");
        System.out.println("1. Jatek inditasa");
        System.out.println("2. Jatekos mozog a playan, nezetet valt");
        System.out.println("3. Utkozes ajtoval");
        System.out.println("4. Kulcs megszerzese");
        System.out.println("5. Palyaelem elhagyasa");
        System.out.println("6. Utkozes");
        System.out.println("7. Karakter lezuhan");
        System.out.println("8. Orautes terjedese");
        System.out.println("Kerlek add meg a tesztesetet amit futtatnal:");
        int futtat = 0;
        try {
            futtat = System.in.read();
        } catch (Exception e) {
        }
        // A bemenet alapján meghívjuk a megfelelő függvényt
        if (futtat == '8') {
            teszt8();
        } else if (futtat == '1') {
            teszt1();
        } else if (futtat == '2') {
            teszt2();
        } else if (futtat == '4') {
            teszt4();
        } else if (futtat == '3') {
            teszt3();
        } else if (futtat == '5') {
            teszt5();
        } else if (futtat == '6') {
            teszt6();
        } else if (futtat == '7') {
            teszt6();
        }
    }

    // tab() függvény - feladata a behúzások kezelése. Minden kiírás előtt meg kell hívni,
    // hogy a kimeneti formátumot megtartsuk
    public static void tab() {
        for (int i = 0; i < tabs; i++) {
            System.out.print("    ");
        }
    }

    // methodCall(hívó osztály, hívó objektum, hívott osztály, hívott objektum, metódus)
    // segítségével a formátumnak megfelelő kimenetet tudunk generálni
    public static void methodCall(String callerClass, String callerObject, String calledClass, String calledObject, String what) {
        tab();
        System.out.println("#CALL:");
        tab();
        System.out.println(callerObject + "(" + callerClass + ") -> " + calledObject + "(" + calledClass + "):" + what);
        tabs++;
    }

    // methodRun(hívó osztály, hívó objektum, hívott osztály, hívott objektum, metódus)
    // a kimeneti formátumnak megfelelő visszatérés kiíratása
    public static void methodReturn(String calledClass, String calledObject, String callerClass, String callerObject, String what) {
        tab();
        System.out.println("#RETURN:");
        tab();
        System.out.println(callerObject + "(" + callerClass + ") --> " + calledObject + "(" + calledClass + "):" + what);
        tabs--;
        if (tabs < 0) {
            tabs = 0;
        }
    }

    // methodCreate(hívó osztály, hívó objektum, hívott osztály, hívott objektum, metódus)
    // a kimeneti formátumnak megfelelő objketum létrehozás kiíratása
    public static void methodCreate(String callerClass, String callerObject, String calledClass, String calledObject) {
        tab();
        System.out.println("#CREATE:");
        tab();
        System.out.println(callerObject + "(" + callerClass + ") -> " + calledObject + "(" + calledClass + "): <<CREATE>>");

    }

    public static void methodDestroy(String callerClass, String callerObject, String calledClass, String calledObject) {
        tab();
        System.out.println("#Destroy:");
        tab();
        System.out.println(callerObject + "(" + callerClass + ") -> " + calledObject + "(" + calledClass + "): <<DESTORY>>");
    }

    // question(kérdés, pozitív válasz, negatív válasz
    // a kimeneti formátumnak megfelelő kérdést tudunk feltenni
    // ha a felhasználó megnyomja a pozitív válaszhoz kapcsolódó gombot
    // true-val, egyébként false-al tér vissza.
    public static boolean Question(String q, char ok, char cancel) {
        tab();
        System.out.print("# " + q + "(" + ok + "/" + cancel + "): ");
        int result = 0;
        try {
            System.in.skip(System.in.available());
            //System.in.read();
            result = System.in.read();
        } catch (Exception e) {
        }
        System.out.println();
        if (result == ok) {
            return true;
        }
        return false;
    }

    // methodEntry(what)
    // a paraméterben megadott objektum metódusnak
    // kiírja a kimeneti foirmátumnak megfelelő belépőszövegét
    public static void methodEntry(String what) {
        tab();
        System.out.println("#" + what + " elindul");
    }

    // methodExit(what)
    // a paraméterben megadott objektum metódusnak
    // kiírja a kimeneti foirmátumnak megfelelő kilépőszövegét
    public static void methodExit(String what) {
        tab();
        System.out.println("#" + what + " kilép");
    }

    // methodVoid(what)
    // olyan metódusok végén kell meghavni, melyekben nincs RETURN kiíratás.
    // Így tudja a rendszer hogy a behúzást csökkenteni kell, mert
    // a hierarchiában kintebbre kerültünk.
    public static void methodVoid() {
        tabs--;
        if (tabs < 0) {
            tabs = 0;
        }
    }

    // Loop(what)
    // A paraméterben megadott szöveggel egy loop szekciót hoz létre
    public static void Loop(String what) {
        tab();
        System.out.println("loop " + what);
        tabs++;
    }

    // LoopEnd()
    // A loop szekció végét jelzi.
    public static void LoopEnd() {
        tabs--;
        tab();
        System.out.println("end");
    }

    // Loop(what)
    // A paraméterben megadott szöveggel egy alt szekciót hoz létre
    public static void Alt(String what) {
        tab();
        System.out.println("alt " + what);
        tabs++;
    }

    // AltEnd()
    // Lezárja az alt szekciót   
    public static void AltEnd() {
        tabs--;
        tab();
        System.out.println("end");
    }

    //a 8. teszteset kezdeti lépései
    public static void teszt8() {
        Game g = new Game("g");
        Clock c = new Clock(g, "c");
        c.run();
    }

    //az 1. teszteset kezdeti lépései
    public static void teszt1() {
        Game g = new Game("g");
        g.init();
        g.startGame();
    }

    //a 4. teszteset kezdeti lépései
    public static void teszt4() {
        LevelItem ActualItem = new LevelItem("ActualItem");
        Character character = new Character(new Point3d(), null, "c");
        ActualItem.intersectAll(character, 4);
    }

    //a 3. teszteset kezdeti lépései
    public static void teszt3() {
        LevelItem ActualItem = new LevelItem("ActualItem");
        Character character = new Character(new Point3d(), new Game("game"), "c");
        ActualItem.intersectAll(character, 3);
    }

    //az 5. teszteset kezdeti lépései
    public static void teszt5() {
        LevelItem ActualItem = new LevelItem("ActualItem");
        LevelItem Neihgbour = new LevelItem("ActualItem");
        Character character = new Character(new Point3d(), new Game("game"), "c");
        Level level = new Level("actualLevel");
        character.move(1);
    }

    //a 6. teszteset kezdeti lépései
    public static void teszt6() {
        LevelItem ActualItem = new LevelItem("ActualItem");
        LevelItem Neihgbour = new LevelItem("ActualItem");
        Character character = new Character(new Point3d(), new Game("game"), "c");
        Level level = new Level("actualLevel");
        character.move(1);
    }

    //a 7. teszteset kezdeti lépései
    public static void teszt7() {
        Game g = new Game("game");
        Character character = new Character(new Point3d(), g, "c");
        Level level = new Level("actualLevel");
        character.move(4); // a 4 a lefele irany
    }

    //a 2. teszteset kezdeti lépései
    public static void teszt2() {
        Game g = new Game("game");
        Character character = new Character(new Point3d(), g, "c");
        Level level = new Level(g, "actualLevel");
        LevelItem li = new LevelItem("ActualItem");
        li.addSprite(new Wall(new Point3d(), 1, 1, "wall"));
        level.setActiveItem(li);
        character.setLevel(level);
        level.addCharacter(character);
        level.startTest2();
    }
}
